Amazon RedshiftでTO_TIMESTAMP関数を使いたい場合の対応方法
以前はサポートされていなかったのですが現在はサポートされています。 TO_TIMESTAMP 関数 - Amazon Redshift
Redshiftには文字列からDATE型に変換するTO_DATE関数はありますが、文字列からTIMESTAMP型に変換するTO_TIMESTAMP関数がありません。使いたい場合は以下のどちらの対応をすることになります
UDFを使う方法
以下のUDFで文字列からTIMESTAMP型へ変換できます。TO_DATEと同じように第1引数に日付の文字列、第2引数にフォーマットを指定します。 フォーマットに関してはYYYY(年)、MM(月)、DD(日)、HH24(0~23時)、HH(午前/午後0~11時)、MI(分)、SS(秒)が使えます。 TO_DATE関数と同じように使え、見た目もいいですがパフォーマンスは以下のCASTの方法の方がいいです。 パフォーマンスに問題がなければこちらでもいいかと思います。
CREATE OR REPLACE FUNCTION f_to_timestamp(text VARCHAR, template VARCHAR) RETURNS TIMESTAMP STABLE AS $$ from datetime import datetime if text is None or template is None: return None template_format_convert_table = [ ["YYYY","%Y"], ["MM","%m"], ["DD","%d"], ["HH24","%H"], ["HH","%I"], ["MI","%M"], ["SS","%S"], ] t = template.upper() for (base, new) in template_format_convert_table: t = t.replace(base, new) return datetime.strptime(text, t) $$ LANGUAGE plpythonu; select f_to_timestamp('2016/09/20 12:34:56', 'YYYY/MM/DD HH24:MI:SS');
CASTする方法
ちょっと面倒な方法ですが、SUBSTRINGで文字列を日付と時間に分割してから、スペースを間に入れて結合した後にCASTします。 パフォーマンスはこちらの方がいいのでお勧めです。
SELECT (SUBSTRING(SAMPLE_DATE,1,8) || ' ' || SUBSTRING(SAMPLE_DATE,9,6))::TIMESTAMP FROM (SELECT '20160913123456'::text SAMPLE_DATE);